package cn.iocoder.yudao.module.lowcode.core.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.lowcode.controller.admin.script.vo.GroovyScriptCreateReqVO;
import cn.iocoder.yudao.module.lowcode.controller.admin.script.vo.GroovyScriptPageReqVO;
import cn.iocoder.yudao.module.lowcode.controller.admin.script.vo.GroovyScriptUpdateReqVO;
import cn.iocoder.yudao.module.lowcode.core.script.GroovyScriptExecutionContext;
import cn.iocoder.yudao.module.lowcode.dal.dataobject.script.GroovyScriptDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * Groovy 脚本 Service 接口
 *
 * @author 芋道源码
 */
public interface GroovyScriptService {

    /**
     * 创建 Groovy 脚本
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createGroovyScript(@Valid GroovyScriptCreateReqVO createReqVO);

    /**
     * 更新 Groovy 脚本
     *
     * @param updateReqVO 更新信息
     */
    void updateGroovyScript(@Valid GroovyScriptUpdateReqVO updateReqVO);

    /**
     * 删除 Groovy 脚本
     *
     * @param id 编号
     */
    void deleteGroovyScript(Long id);

    /**
     * 获得 Groovy 脚本
     *
     * @param id 编号
     * @return Groovy 脚本
     */
    GroovyScriptDO getGroovyScript(Long id);

    /**
     * 获得 Groovy 脚本列表
     *
     * @param ids 编号
     * @return Groovy 脚本列表
     */
    List<GroovyScriptDO> getGroovyScriptList(Collection<Long> ids);

    /**
     * 获得 Groovy 脚本分页
     *
     * @param pageReqVO 分页查询
     * @return Groovy 脚本分页
     */
    PageResult<GroovyScriptDO> getGroovyScriptPage(GroovyScriptPageReqVO pageReqVO);

    /**
     * 根据脚本名称获取脚本
     *
     * @param scriptName 脚本名称
     * @return Groovy 脚本
     */
    GroovyScriptDO getGroovyScriptByName(String scriptName);

    /**
     * 根据分类获取脚本列表
     *
     * @param category 分类
     * @return 脚本列表
     */
    List<GroovyScriptDO> getGroovyScriptsByCategory(String category);

    /**
     * 获取活跃脚本列表
     *
     * @return 活跃脚本列表
     */
    List<GroovyScriptDO> getActiveGroovyScripts();

    /**
     * 执行 Groovy 脚本
     *
     * @param scriptName 脚本名称
     * @param context 执行上下文
     * @return 执行结果
     */
    Object executeScript(String scriptName, GroovyScriptExecutionContext context);

    /**
     * 验证 Groovy 脚本语法
     *
     * @param scriptContent 脚本内容
     * @return 验证结果
     */
    ScriptValidationResult validateScript(String scriptContent);

    /**
     * 测试 Groovy 脚本执行
     *
     * @param scriptContent 脚本内容
     * @param context 测试上下文
     * @return 测试结果
     */
    Object testScript(String scriptContent, GroovyScriptExecutionContext context);

    /**
     * 清除脚本缓存
     *
     * @param scriptName 脚本名称
     */
    void evictScriptCache(String scriptName);

    /**
     * 清除所有脚本缓存
     */
    void evictAllScriptCache();

    /**
     * 脚本验证结果
     */
    interface ScriptValidationResult {
        boolean isValid();
        String getErrorMessage();
        List<String> getWarnings();
    }
}